package br.fatec.model.dao;

import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.Usuario;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;

public class UsuarioDao {

	private Persistencia persis;

	public UsuarioDao() {
		Globals globals = Globals.getInstance();

		this.persis = globals.getPersistencia();
	}

	public void cadastrar(Usuario usuario) throws Exception {
		persis.cadastrar(usuario);
	}

	public void alterar(Usuario usuario) throws Exception {
		persis.alterar(usuario);
	}

	public void excluir(Usuario usuario) throws Exception {
		persis.excluir(usuario.getClass(), usuario.getCodigo());
	}

	public void desativar(Usuario usuario) throws Exception {
		usuario = consultar(usuario.getCodigo());

		usuario.setAtivo(false);

		persis.alterar(usuario);
	}

	public Usuario consultar(Integer codigo) throws Exception {
		String query = "select * from usuario where codigo = :codigo and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);	

		return (Usuario) persis.consultar(Usuario.class, query, parametros);
	}

	public Usuario consultar(String nomeUsuario)
			throws Exception {

		String query = "select * from usuario where nome_usuario = :nome_usuario and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome_usuario", nomeUsuario);
		parametros.put("ativo", true);	

		return (Usuario) persis.consultar(Usuario.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public Usuario consultarUltimoNome(String nomeUsuario)
			throws Exception {

		String query = "select * from usuario where nome_usuario ilike :nome_usuario and ativo = :ativo order by nome_usuario desc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome_usuario", nomeUsuario + "%");
		parametros.put("ativo", true);
		
		List<Usuario> usuarios = (List<Usuario>)persis.listar(Usuario.class, query, parametros);
		
		if(usuarios != null && usuarios.size() > 0)
			return usuarios.get(0);
		
		return null;
	}

	public Usuario consultar(String nomeUsuario, String senha) throws Exception {
		String query = "select * from usuario where nome_usuario = :nome_usuario and senha = :senha and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome_usuario", nomeUsuario);
		parametros.put("senha", senha);
		parametros.put("ativo", true);

		return (Usuario) persis.consultar(Usuario.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listar() throws Exception {
		String query = "select * from usuario where ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);

		return (List<Usuario>) persis.listar(Usuario.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listar(String nome) throws Exception {
		Persistencia con = new Persistencia();
		String query = "select * from usuario where nome_usuario ilike :nome and ativo = :ativo order by nome_usuario asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome_usuario", "%" + nome + "%");
		parametros.put("ativo", true);

		return (List<Usuario>) con.listar(Usuario.class, query, parametros);
	}
}
